An OS (Operating System) that operates in a computer transmits data, which may be referred to as a command, generated based on a predetermined set of rules in a case where it sends an instruction to perform a predetermined task to an I/O device coupled to the computer.
A high performance I/O device uses a method of command execution called an “out of order” execution. With the out of order execution, the I/O device may execute a process with respect to a command in an order that is different from the order the command was received, and notify the completion of the process to the OS.
With the out of order execution method, the OS in general assigns a command identifier to the command in order to determine a command that corresponds to the completion of the process, and assigns a command identifier to the notification for completing the process as well.
In a case a command identifier collides with another command identifier in a command group that is being executed, the OS may not be able to determine which command has been completed, and this may prevent a normal I/O process from being completed. Accordingly, the OS on the side of issuing commands may include a function to prevent the collided command identifiers from being assigned.
A conventional I/O device trusts that a command identifier that is assigned to a received command is unique, and uses the command identifier without determining whether or not the command identifier collided with another. However, in order to achieve higher reliability of the I/O processing, there is a demand to confirm whether or not command identifiers collide with another on the I/O devices.
For example, when generating an identifier, a well-known technique to examine whether or not the identifier collides with another would narrow identifiers that are reasonably believed to be comparable based on time information, and examine whether or not they collide (for example, see Japanese Patent Application Laid-open Publication No. 2005-339134 A).